from pyecharts import options as opts
from pyecharts.charts import Map

class ChinaPatentHeatmap:
    def __init__(self):
        self.map_name = "china"
    
        
    def generate(self, province_data, save_path):
        """生成热力图
        Args:
            province_data: List[ProvincePatent] - 省份专利数据列表
            save_path: str - 保存路径
        """
        # 转换数据格式
        data = [
            (item.province, item.count)
            for item in province_data
        ]
        
        # 创建地图实例
        map_chart = Map(
            init_opts=opts.InitOpts(
                width="800px",  # 增加宽度
                height="600px",  # 增加高度
                bg_color="#ffffff"
            )
        )
        
        # 添加数据
        map_chart.add(
            series_name="专利数量",  # 设置系列名称
            data_pair=data,
            maptype="china",
            is_roam=True,
            label_opts=opts.LabelOpts(
                is_show=True,  # 显示标签
                color="rgba(0, 0, 0, 0.5)",  # 设置字体颜色为黑色，50% 透明度
                font_size=12,  # 字体大小
                font_style="normal",  # 字体样式
                formatter=lambda params: (
                "" if ("广西" in params.name or "香港" in params.name or "澳门" in params.name)
                else params.name
            )

            ),
            center=[120, 25]
        )
        
        # 设置全局配置
        map_chart.set_global_opts(
            title_opts=opts.TitleOpts(
                is_show=False,
                title="中国专利分布热力图",
                pos_left="center",  # 标题居中
                pos_top="10px"  # 标题距离顶部 10px
            ),
            visualmap_opts=opts.VisualMapOpts(
                is_show=False,  
                min_=0,
                max_=max(count for _, count in data),
                range_text=["High", "Low"],
                is_calculable=True,
                range_color=["lightskyblue", "yellow", "orangered"],
                pos_right="50px",  # 将 VisualMap 向右移动 50px
                pos_top="100px"  # 将 VisualMap 向下移动 100px
            ),
            legend_opts=opts.LegendOpts(is_show=False),

        )
        
        # 生成图表
        map_chart.render(save_path)
        return save_path